gdk: add a sanity check for events
authorMatthias Clasen <mclasen@redhat.com>
Wed, 1 May 2019 20:39:00 +0000 (20:39 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 1 May 2019 20:50:24 +0000 (20:50 +0000)
Before delivering events to GTK, make sure
they're sane. For now, this means making sure
the surface and device are from the same
display.

gdk/gdkevents.c
gdk/gdkeventsprivate.h

index d9e9af6eeff5b825abf5a54b934d785180ef2413..8d31e55fda57313cfec82bb66bf5020d62c7986e 100644 (file)
@@ -146,15 +146,48 @@ gdk_event_class_init (GdkEventClass *klass)
   g_object_class_install_properties (object_class, N_PROPS, event_props);
 }
 
-void
-_gdk_event_emit (GdkEvent *event)
+gboolean
+check_event_sanity (GdkEvent *event)
 {
+  GdkDisplay *display;
+  GdkSurface *surface;
+  GdkDevice *device;
+
+  display = gdk_event_get_display (event);
+  surface = gdk_event_get_surface (event);
+  device = gdk_event_get_device (event);
+
   if (gdk_event_get_event_type (event) == GDK_NOTHING)
     {
       g_warning ("Ignoring GDK_NOTHING events; they're good for nothing");
-      return;
+      return FALSE;
+    }
+
+  if (surface && display != gdk_surface_get_display (surface))
+    {
+      char *type = g_enum_to_string (GDK_TYPE_EVENT_TYPE, event->any.type);
+      g_warning ("Event of type %s with mismatched surface display", type);
+      g_free (type);
+      return FALSE;
     }
 
+  if (device && display != gdk_device_get_display (device))
+    {
+      char *type = g_enum_to_string (GDK_TYPE_EVENT_TYPE, event->any.type);
+      g_warning ("Event of type %s with mismatched device display", type);
+      g_free (type);
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+void
+_gdk_event_emit (GdkEvent *event)
+{
+  if (!check_event_sanity (event))
+    return;
+
   if (gdk_drag_handle_source_event (event))
     return;
 
index 2db43d9a828d44dc17053682b71464fbd330f95a..eefc1f4622dd97b48c560d1b387f02beeb213d5b 100644 (file)
@@ -645,5 +645,7 @@ void           gdk_event_set_related_target       (GdkEvent *event,
                                                   GObject  *user_data);
 GObject *      gdk_event_get_related_target      (const GdkEvent *event);
 
+gboolean       check_event_sanity (GdkEvent *event);
+
 
 #endif /* __GDK_EVENTS_PRIVATE_H__ */